import { describe, expect, it } from '@jest/globals';
import { prdResponseSchema } from '../../../../../scripts/modules/task-manager/parse-prd/parse-prd-config.js';

describe('PRD Response Schema', () => {
	const validTask = {
		id: 1,
		title: 'Test Task',
		description: 'Test description',
		details: 'Test details',
		testStrategy: 'Test strategy',
		priority: 'high',
		dependencies: [],
		status: 'pending'
	};

	describe('Valid responses', () => {
		it('should accept response with tasks and metadata', () => {
			const response = {
				tasks: [validTask],
				metadata: {
					projectName: 'Test Project',
					totalTasks: 1,
					sourceFile: 'test.txt',
					generatedAt: '2025-01-01T00:00:00Z'
				}
			};

			const result = prdResponseSchema.safeParse(response);
			expect(result.success).toBe(true);
		});

		it('should accept response with tasks and null metadata', () => {
			const response = {
				tasks: [validTask],
				metadata: null
			};

			const result = prdResponseSchema.safeParse(response);
			expect(result.success).toBe(true);
		});

		it('should accept response with only tasks (no metadata field)', () => {
			// This is what ZAI returns - just the tasks array without metadata
			const response = {
				tasks: [validTask]
			};

			const result = prdResponseSchema.safeParse(response);
			expect(result.success).toBe(true);
			if (result.success) {
				// With .default(null), omitted metadata becomes null
				expect(result.data.metadata).toBeNull();
			}
		});

		it('should accept response with multiple tasks', () => {
			const response = {
				tasks: [validTask, { ...validTask, id: 2, title: 'Second Task' }]
			};

			const result = prdResponseSchema.safeParse(response);
			expect(result.success).toBe(true);
		});
	});

	describe('Invalid responses', () => {
		it('should reject response without tasks field', () => {
			const response = {
				metadata: null
			};

			const result = prdResponseSchema.safeParse(response);
			expect(result.success).toBe(false);
		});

		it('should reject response with empty tasks array and invalid metadata', () => {
			const response = {
				tasks: [],
				metadata: 'invalid'
			};

			const result = prdResponseSchema.safeParse(response);
			expect(result.success).toBe(false);
		});

		it('should reject task with missing required fields', () => {
			const response = {
				tasks: [
					{
						id: 1,
						title: 'Test'
						// missing other required fields
					}
				]
			};

			const result = prdResponseSchema.safeParse(response);
			expect(result.success).toBe(false);
		});

		it('should reject task with invalid priority', () => {
			const response = {
				tasks: [
					{
						...validTask,
						priority: 'invalid'
					}
				]
			};

			const result = prdResponseSchema.safeParse(response);
			expect(result.success).toBe(false);
		});
	});

	describe('ZAI-specific response format', () => {
		it('should handle ZAI response format (tasks only, no metadata)', () => {
			// This is the actual format ZAI returns
			const zaiResponse = {
				tasks: [
					{
						id: 24,
						title: 'Core Todo Data Management',
						description:
							'Implement the core data structure and CRUD operations',
						status: 'pending',
						dependencies: [],
						priority: 'high',
						details: 'Create a Todo data model with properties...',
						testStrategy: 'Unit tests for TodoManager class...'
					},
					{
						id: 25,
						title: 'Todo UI and User Interactions',
						description: 'Create the user interface components',
						status: 'pending',
						dependencies: [24],
						priority: 'high',
						details: 'Build a simple HTML/CSS/JS interface...',
						testStrategy: 'UI component tests...'
					}
				]
			};

			const result = prdResponseSchema.safeParse(zaiResponse);
			expect(result.success).toBe(true);
			if (result.success) {
				expect(result.data.tasks).toHaveLength(2);
				// With .default(null), omitted metadata becomes null (not undefined)
				expect(result.data.metadata).toBeNull();
			}
		});
	});
});
